Data can be migrated between computing devices in a variety of ways. In the context of virtual machines, it can be migrated in at least two ways: (1) using “cold” migration, where a source virtual machine is shut down, and data in the source is transferred to a target virtual machine; (2) alternatively, data can be transferred using “hot” (or “live”) migration, where the source virtual machine is running as data is transferred to the target virtual machine. Each migration technique has its own set of advantages and disadvantages. For instance, “cold” migration may result in virtual machines being down or offline for too long as data is being transferred, while “hot” migration may result in the transferring of data that keeps changing on the source virtual machine relative to the target virtual machine, which requires special server-server bindings, configuration settings, and other special hardware. Thus, “warm” migration mechanisms are needed that smartly transfer data among virtual machines, minimizing the downtime of such machines but at the same time maximizing the consistent state of data stored thereon (while reducing the requirements and configuration for the servers involved in the process).